<?php
/**
 * セッション管理クラス
 */
final class Session {

	public function init () {
		Y('this.ID+', null);
	}

	/**
	 * callでセッションスタート
	 */
	public function call() {
		if (Y('this.ID') != null) return true;

		if (headers_sent()) {
			$Res = false;
			Y('Logger.Debug', 'ヘッダ送信済みの状態でセッションを開始しようとしました。');
		} else {
			if (!$SID = Y('Request.GET.session')) $SID = Y('Request.POST.session');
			
			if ($SID) {
				ini_set ('session.use_cookies', '0');
				ini_set ('session.cookie_httponly', '0');
				session_id ($SID);
			} else {
				session_id ();
			}
			$Res = session_start();
			if ($Res) {
				// セッション変数は強制的に_Arr型
				Y('this.Vars+', new _array ($_SESSION));
				Y('this.ID+', session_id());
				if (Y('Logger.Debug$')) {
					if (Y('this.Vars')) {
						Y('Logger.Debug', 'セッション開始(読込)');
					} else {
						Y('Logger.Debug', 'セッション開始(新規)');
					}
					Y('Logger.Debug', 'セッションID = '. Y('this.ID'));
				}
			} elseif (Y('Logger.Debug$')) {
				Y('Logger.Debug', '!セッション開始に失敗');
			}
		}
		return $Res;
	}

	public function __destruct () {
		$_SESSION = Y('Helper.List.Session.Vars');
	}

	/**
	 * セッションを終了
	 */
	public function destroy() {
		if ($this->ID == null) return false;

		$Res = session_destroy();
		$YuTori = getSystem('YuTori');

		if ($YuTori->getConfig('DebugMode','switch')) {
			if ($Res) {
				$Log = getSystem('LogManager');
				$Log->setDebugLog ('セッション終了');
			} else {
				$Log = getSystem('LogManager');
				$Log->setDebugLog ('!セッション終了に失敗');
			}
		}
		return $Res;
	}
}
?>